From ff4f07d76fc0cb253abc44856139fd8cf65699fd Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 7 Jul 2021 13:56:19 -0400 Subject: [PATCH] composetable: Handle substitutions in includes Hande the %H, %L, %S substitutions that are described in Compose(7). Test included. --- gtk/gtkcomposetable.c | 46 +- testsuite/gtk/compose/system | 1 + testsuite/gtk/compose/system.expected | 587 ++++++++++++++++++++++++++ testsuite/gtk/composetable.c | 2 + 4 files changed, 635 insertions(+), 1 deletion(-) create mode 100644 testsuite/gtk/compose/system create mode 100644 testsuite/gtk/compose/system.expected diff --git a/gtk/gtkcomposetable.c b/gtk/gtkcomposetable.c index b8561aa161..af064d7461 100644 --- a/gtk/gtkcomposetable.c +++ b/gtk/gtkcomposetable.c @@ -254,6 +254,50 @@ fail: static void parser_parse_file (GtkComposeParser *parser, const char *path); +/* Substitute %H, %L and %S */ +static char * +handle_substitutions (const char *start, + int length) +{ + GString *s; + const char *locale_name; + const char *p; + + s = g_string_new (""); + + locale_name = getenv ("LANG"); + + for (p = start; *p && p < start + length; p++) + { + if (*p != '%') + { + g_string_append_c (s, *p); + } + else + { + switch (p[1]) + { + case 'H': + p++; + g_string_append (s, g_get_home_dir ()); + break; + case 'L': + p++; + g_string_append_printf (s, "/usr/share/X11/locale/%s/Compose", locale_name); + break; + case 'S': + p++; + g_string_append (s, "/usr/share/X11/locale"); + break; + default: ; + /* do nothing, next iteration handles p[1] */ + } + } + } + + return g_string_free (s, FALSE); +} + static void parser_handle_include (GtkComposeParser *parser, const char *line) @@ -290,7 +334,7 @@ parser_handle_include (GtkComposeParser *parser, if (*p && *p != '#') goto error; - path = g_strndup (start, end - start); + path = handle_substitutions (start, end - start); parser_parse_file (parser, path); diff --git a/testsuite/gtk/compose/system b/testsuite/gtk/compose/system new file mode 100644 index 0000000000..28fe1f1616 --- /dev/null +++ b/testsuite/gtk/compose/system @@ -0,0 +1 @@ +include "%L" diff --git a/testsuite/gtk/compose/system.expected b/testsuite/gtk/compose/system.expected new file mode 100644 index 0000000000..6fdf4fab29 --- /dev/null +++ b/testsuite/gtk/compose/system.expected @@ -0,0 +1,587 @@ +# n_seqs: 585 +# max_seq_len: 5 + : "ុះ" + : "ុំ" + : "េះ" + : "ោះ" + : "ាំ" + : "M̀" + : "m̀" + : "Ɔ̀" + : "Ǝ̀" + : "Ɛ̀" + : "Ɩ̀" + : "Ʊ̀" + : "Ʋ̀" + : "ǝ̀" + : "ɔ̀" + : "ɛ̀" + : "ɩ̀" + : "ʊ̀" + : "ʋ̀" + : "Ŋ̀" + : "ŋ̀" + : "а̀" + : "о̀" + : "р̀" + : "у̀" + : "А̀" + : "О̀" + : "Р̀" + : "У̀" + : "ἂ" # U1f02 + : "ἃ" # U1f03 + : "Ἂ" # U1f0a + : "Ἃ" # U1f0b + : "ἒ" # U1f12 + : "ἓ" # U1f13 + : "Ἒ" # U1f1a + : "Ἓ" # U1f1b + : "ἢ" # U1f22 + : "ἣ" # U1f23 + : "Ἢ" # U1f2a + : "Ἣ" # U1f2b + : "ἲ" # U1f32 + : "ἳ" # U1f33 + : "Ἲ" # U1f3a + : "Ἳ" # U1f3b + : "ὂ" # U1f42 + : "ὃ" # U1f43 + : "Ὂ" # U1f4a + : "Ὃ" # U1f4b + : "ὒ" # U1f52 + : "ὓ" # U1f53 + : "Ὓ" # U1f5b + : "ὢ" # U1f62 + : "ὣ" # U1f63 + : "Ὢ" # U1f6a + : "Ὣ" # U1f6b + : "Ã̀" + : "Ẽ̀" + : "Ĩ̀" + : "Õ̀" + : "Ũ̀" + : "ã̀" + : "ẽ̀" + : "ĩ̀" + : "õ̀" + : "ũ̀" + : "Ɔ̃̀" + : "Ǝ̃̀" + : "Ɛ̃̀" + : "ǝ̃̀" + : "ɔ̃̀" + : "ɛ̃̀" + : "J́" + : "j́" + : "Ɔ́" + : "Ǝ́" + : "Ɛ́" + : "Ɩ́" + : "Ʊ́" + : "Ʋ́" + : "ǝ́" + : "ɔ́" + : "ɛ́" + : "ɩ́" + : "ʊ́" + : "ʋ́" + : "Ŋ́" + : "ŋ́" + : "ю́" + : "а́" + : "е́" + : "и́" + : "о́" + : "я́" + : "р́" + : "у́" + : "ы́" + : "э́" + : "Ю́́" + : "А́" + : "Е́" + : "И́" + : "О́" + : "Я́" + : "Р́" + : "У́" + : "Ы́" + : "Э́" + : "ἄ" # U1f04 + : "ἅ" # U1f05 + : "Ἄ" # U1f0c + : "Ἅ" # U1f0d + : "ἔ" # U1f14 + : "ἕ" # U1f15 + : "Ἔ" # U1f1c + : "Ἕ" # U1f1d + : "ἤ" # U1f24 + : "ἥ" # U1f25 + : "Ἤ" # U1f2c + : "Ἥ" # U1f2d + : "ἴ" # U1f34 + : "ἵ" # U1f35 + : "Ἴ" # U1f3c + : "Ἵ" # U1f3d + : "ὄ" # U1f44 + : "ὅ" # U1f45 + : "Ὄ" # U1f4c + : "Ὅ" # U1f4d + : "ὔ" # U1f54 + : "ὕ" # U1f55 + : "Ὕ" # U1f5d + : "ὤ" # U1f64 + : "ὥ" # U1f65 + : "Ὤ" # U1f6c + : "Ὥ" # U1f6d + : "Ã́" + : "Ẽ́" + : "Ĩ́" + : "ã́" + : "ẽ́" + : "ĩ́" + : "Ɔ̃́" + : "Ǝ̃́" + : "Ɛ̃́" + : "ǝ̃́" + : "ɔ̃́" + : "ɛ̃́" + : "Ɔ̂" + : "Ǝ̂" + : "Ɛ̂" + : "Ɩ̂" + : "Ʊ̂" + : "Ʋ̂" + : "ǝ̂" + : "ɔ̂" + : "ɛ̂" + : "ɩ̂" + : "ʊ̂" + : "ʋ̂" + : "а̂" + : "е̂" + : "и̂" + : "о̂" + : "р̂" + : "у̂" + : "А̂" + : "Е̂" + : "И̂" + : "О̂" + : "Р̂" + : "У̂" + : "Ậ" # U1eac + : "ậ" # U1ead + : "Ệ" # U1ec6 + : "ệ" # U1ec7 + : "Ộ" # U1ed8 + : "ộ" # U1ed9 + : "Ɔ̃" + : "Ǝ̃" + : "Ɛ̃" + : "ǝ̃" + : "ɔ̃" + : "ɛ̃" + : "Ɔ̄" + : "Ǝ̄" + : "Ɛ̄" + : "Ɩ̄" + : "Ʊ̄" + : "Ʋ̄" + : "ǝ̄" + : "Ǭ" # U1ec + : "ǭ" # U1ed + : "Ǡ" # U1e0 + : "ǡ" # U1e1 + : "Ȱ" # U230 + : "ȱ" # U231 + : "ɔ̄" + : "ɛ̄" + : "ɩ̄" + : "ʊ̄" + : "ʋ̄" + : "а̄" + : "е̄" + : "о̄" + : "р̄" + : "А̄" + : "Е̄" + : "О̄" + : "Р̄" + : "Ḹ" # U1e38 + : "ḹ" # U1e39 + : "Ṝ" # U1e5c + : "ṝ" # U1e5d + : "Ǖ" # U1d5 + : "ǖ" # U1d6 + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "Ặ" # U1eb6 + : "ặ" # U1eb7 + : "ẛ" # U1e9b + : "Ṩ" # U1e68 + : "ṩ" # U1e69 + : "Ȫ" # U22a + : "Ӛ" # U4da + : "ӛ" # U4db + : "Ӫ" # U4ea + : "ӫ" # U4eb + : "Ṻ" # U1e7a + : "ṻ" # U1e7b + : "Ɔ̌" + : "Ǝ̌" + : "Ɛ̌" + : "Ɩ̌" + : "Ʊ̌" + : "Ʋ̌" + : "ǝ̌" + : "ɔ̌" + : "ɛ̌" + : "ɩ̌" + : "ʊ̌" + : "ʋ̌" + : "Ḝ" # U1e1c + : "ḝ" # U1e1d + : "ᾀ" # U1f80 + : "ᾁ" # U1f81 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾆ" # U1f86 + : "ᾇ" # U1f87 + : "ᾈ" # U1f88 + : "ᾉ" # U1f89 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾎ" # U1f8e + : "ᾏ" # U1f8f + : "ᾐ" # U1f90 + : "ᾑ" # U1f91 + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾖ" # U1f96 + : "ᾗ" # U1f97 + : "ᾘ" # U1f98 + : "ᾙ" # U1f99 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾞ" # U1f9e + : "ᾟ" # U1f9f + : "ᾠ" # U1fa0 + : "ᾡ" # U1fa1 + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾦ" # U1fa6 + : "ᾧ" # U1fa7 + : "ᾨ" # U1fa8 + : "ᾩ" # U1fa9 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ᾮ" # U1fae + : "ᾯ" # U1faf + : "ᾲ" # U1fb2 + : "ῂ" # U1fc2 + : "ῲ" # U1ff2 + : "ᾷ" # U1fb7 + : "ῇ" # U1fc7 + : "ῷ" # U1ff7 + : "ᾂ" # U1f82 + : "ᾃ" # U1f83 + : "ᾊ" # U1f8a + : "ᾋ" # U1f8b + : "ᾒ" # U1f92 + : "ᾓ" # U1f93 + : "ᾚ" # U1f9a + : "ᾛ" # U1f9b + : "ᾢ" # U1fa2 + : "ᾣ" # U1fa3 + : "ᾪ" # U1faa + : "ᾫ" # U1fab + : "ᾄ" # U1f84 + : "ᾅ" # U1f85 + : "ᾌ" # U1f8c + : "ᾍ" # U1f8d + : "ᾔ" # U1f94 + : "ᾕ" # U1f95 + : "ᾜ" # U1f9c + : "ᾝ" # U1f9d + : "ᾤ" # U1fa4 + : "ᾥ" # U1fa5 + : "ᾬ" # U1fac + : "ᾭ" # U1fad + : "ゔ" # U3094 + : "が" # U304c + : "ぎ" # U304e + : "ぐ" # U3050 + : "げ" # U3052 + : "ご" # U3054 + : "ざ" # U3056 + : "じ" # U3058 + : "ず" # U305a + : "ぜ" # U305c + : "ぞ" # U305e + : "だ" # U3060 + : "ぢ" # U3062 + : "づ" # U3065 + : "で" # U3067 + : "ど" # U3069 + : "ば" # U3070 + : "び" # U3073 + : "ぶ" # U3076 + : "べ" # U3079 + : "ぼ" # U307c + : "ゞ" # U309e + : "ヸ" # U30f8 + : "ヹ" # U30f9 + : "ヾ" # U30fe + : "ぱ" # U3071 + : "ぴ" # U3074 + : "ぷ" # U3077 + : "ぺ" # U307a + : "ぽ" # U307d + : "≮" # U226e + : "≠" # U2260 + : "≯" # U226f + : "Ѷ" # U476 + : "ѷ" # U477 + : "а̏" + : "е̏" + : "и̏" + : "о̏" + : "р̏" + : "у̏" + : "А̏" + : "Е̏" + : "И̏" + : "О̏" + : "Р̏" + : "У̏" + : "Ȃ" # U202 + : "Ȇ" # U206 + : "Ȋ" # U20a + : "Ȏ" # U20e + : "Ȓ" # U212 + : "Ȗ" # U216 + : "ȃ" # U203 + : "ȇ" # U207 + : "ȋ" # U20b + : "ȏ" # U20f + : "ȓ" # U213 + : "ȗ" # U217 + : "а̑" + : "е̑" + : "и̑" + : "о̑" + : "р̑" + : "у̑" + : "А̑" + : "Е̑" + : "И̑" + : "О̑" + : "Р̑" + : "У̑" + : "لآ" + : "لأ" + : "لإ" + : "لا" + : "̈́" # U344 + : "J́" + : "j́" + : "ю́" + : "а́" + : "е́" + : "и́" + : "о́" + : "я́" + : "р́" + : "у́" + : "ы́" + : "э́" + : "Ю́́" + : "А́" + : "Е́" + : "И́" + : "О́" + : "Я́" + : "Р́" + : "У́" + : "Ы́" + : "Э́" + : "㊿" # U32bf + : "㊿" # U32bf + : "⍟" # U235f + : "Ā" # U100 + : "Ō" # U14c + : "⊖" # U2296 + : "⊙" # U2299 + : "Ā" # U100 + : "Ā" # U100 + : "🖕" # U1f595 + : "J́" + : "J́" + : "₤" # U20a4 + : "🖖" # U1f596 + : "Ō" # U14c + : "Ō" # U14c + : "🙌" # U1f64c + : "⍉" # U2349 + : "а̂" + : "е̂" + : "и̂" + : "о̂" + : "р̂" + : "у̂" + : "А̂" + : "Е̂" + : "И̂" + : "О̂" + : "Р̂" + : "У̂" + : "а̄" + : "е̄" + : "о̄" + : "р̄" + : "А̄" + : "Е̄" + : "О̄" + : "Р̄" + : "⊆" # U2286 + : "⊇" # U2287 + : "⍊" # U234a + : "⍜" # U235c + : "а̏" + : "е̏" + : "и̏" + : "о̏" + : "р̏" + : "у̏" + : "А̏" + : "Е̏" + : "И̏" + : "О̏" + : "Р̏" + : "У̏" + : "а̀" + : "о̀" + : "р̀" + : "у̀" + : "А̀" + : "О̀" + : "Р̀" + : "У̀" + : "ā" # U101 + : "j́" + : "j́" + : "ō" # U14d + : "💩" # U1f4a9 + : "⍋" # U234b + : "⍒" # U2352 + : "⍦" # U2366 + : "⍧" # U2367 + : "⌽" # U233d + : "⍡" # U2361 + : "⍥" # U2365 + : "а̄" + : "е̄" + : "о̄" + : "р̄" + : "А̄" + : "Е̄" + : "О̄" + : "Р̄" + : "ṝ" # U1e5d + : "⍑" # U2351 + : "J́" + : "j́" + : "ю́" + : "а́" + : "е́" + : "и́" + : "о́" + : "я́" + : "р́" + : "у́" + : "ы́" + : "э́" + : "Ю́́" + : "А́" + : "Е́" + : "И́" + : "О́" + : "Я́" + : "Р́" + : "У́" + : "Ы́" + : "Э́" + : "ᾧ" # U1fa7 + : "⍝" # U235d + : "⍕" # U2355 + : "⍎" # U234e + : "⌻" # U233b + : "⌾" # U233e + : "⍦" # U2366 + : "⊆" # U2286 + : "⍧" # U2367 + : "⊇" # U2287 + : "⊈" # U2288 + : "⊉" # U2289 + : "⋢" # U22e2 + : "⋣" # U22e3 + : "⍡" # U2361 + : "⍑" # U2351 + : "⍕" # U2355 + : "⌶" # U2336 + : "⍊" # U234a + : "⍎" # U234e + : "⌶" # U2336 + : "⋪" # U22ea + : "⋫" # U22eb + : "⋬" # U22ec + : "⋭" # U22ed + : "⍚" # U235a + : "⌺" # U233a + : "⍸" # U2378 + : "⍹" # U2379 + : "⍶" # U2376 + : "⍞" # U235e + : "⍁" # U2341 + : "⍠" # U2360 + : "⍃" # U2343 + : "⌸" # U2338 + : "⍄" # U2344 + : "⍰" # U2370 + : "⍂" # U2342 + : "⌹" # U2339 + : "⍇" # U2347 + : "⍐" # U2350 + : "⍈" # U2348 + : "⍗" # U2357 + : "⍍" # U234d + : "⍔" # U2354 + : "⌻" # U233b + : "⍓" # U2353 + : "⍌" # U234c + : "⍯" # U236f + : "⌺" # U233a + : "⌼" # U233c + : "⍟" # U235f + : "⊖" # U2296 + : "⊙" # U2299 + : "⍉" # U2349 + : "⍜" # U235c + : "⌽" # U233d + : "⍥" # U2365 + : "⌾" # U233e + : "⌼" # U233c diff --git a/testsuite/gtk/composetable.c b/testsuite/gtk/composetable.c index 1414a7c99f..f2875c46c1 100644 --- a/testsuite/gtk/composetable.c +++ b/testsuite/gtk/composetable.c @@ -383,6 +383,7 @@ main (int argc, char *argv[]) { char *dir; + g_setenv ("LC_ALL", "en_US.UTF-8", TRUE); dir = g_dir_make_tmp ("composetableXXXXXX", NULL); g_setenv ("XDG_CACHE_HOME", dir, TRUE); g_free (dir); @@ -405,6 +406,7 @@ main (int argc, char *argv[]) g_test_add_data_func ("/compose-table/multi", "multi", compose_table_compare); g_test_add_data_func ("/compose-table/strings", "strings", compose_table_compare); g_test_add_data_func ("/compose-table/include", "include", compose_table_compare); + g_test_add_data_func ("/compose-table/system", "system", compose_table_compare); g_test_add_func ("/compose-table/include-cycle", compose_table_cycle); g_test_add_func ("/compose-table/include-nofile", compose_table_nofile); g_test_add_func ("/compose-table/match", compose_table_match); -- 2.30.2